import numpy as np

# 1. NumPy数组创建例程

# numpy.empty
"""
创建指定形状和dtype的未初始化数组。该函数的用法如下：
numpy.empty(shape, dtype = float, order = 'C')
构造器接收下列参数：
　shape：空数组的形状，整数或整数元组。
　dtype：所需的输出数组类型，可选。默认类型为 float
　order：'C'为按行的C风格数组，'F'为按列的Fortran风格数组。

注意：数组元素为随机值，因为它们未初始化
"""
a = np.empty([2, 3], int)
print(a)
print()


# numpy.zeros
"""
返回特定大小，以0填充的新数组。该函数的用法如下：
numpy.zeros(shape, dtype = float, order = 'C')
构造器接收下列参数：
　shape：空数组的形状，整数或整数元组。
　dtype：所需的输出数组类型，可选。默认类型为 float
　order：'C'为按行的C风格数组，'F'为按列的Fortran风格数组。

"""
a = np.zeros([2, 3], int, "C")
print(a)  # [[0, 0, 0], [0, 0, 0]]
print()
a = np.zeros(5, int)
print(a)  # [0, 0, 0, 0, 0]
print()


# numpy.ones
"""
numpy.ones(shape, dtype = None, order = 'C')
构造器接收下列参数：
　shape：空数组的形状，整数或整数元组。
　dtype：所需的输出数组类型，可选。默认类型为 float
　order：'C'为按行的C风格数组，'F'为按列的Fortran风格数组。
"""

a = np.ones(5)
print(a)  # [1. 1. 1. 1. 1.]
print()

a = np.ones([2, 3], int)
print(a)  # [[1, 1, 1], [1, 1, 1]]
print()


# 2. NumPy现有数据数组

# numpy.asarray
# 该函数类似于numpy.array，除了它有较少的参数外。
# 这个例程对于将Python序列转换为ndarray非常有用。
"""
numpy.asarray(a, dtype = None, order = None)
构造器接收下列参数：
　a：任意形式的输入参数，比如列表、列表的元组、元组、元组的元组、元组的列表。
　dtype：通常输入数据的类型会应用到返回的ndarray。
　order：'C'为按行的C风格数组，'F'为按列的Fortran风格数组。
"""
x = [1, 2, 3]
a = np.asarray(x, float)
print(a)
a = np.array(x)
print(a)
print()


# numpy.frombuffer
# 此函数将缓冲区解释为一维数组。暴露缓冲区接口的任何对象都用作参数来返回ndarray
"""
numpy.frombuffer(buffer, dtype=float, count=-1, offset=0)
构造器接收下列参数：
　buffer：任何暴露缓冲区接口的对象。
　dtype：返回数组的数据类型，默认为float。
　count：需要读取的数据数量，默认为-1，读取所有数据。
　offset：需要读取的起始位置，默认为0。
"""
# s = "Hello World"
# a = np.frombuffer(s, dtype="S1")
s = b"Hello World "  # b表示该字符串是bytes类型

# 'S1'表示一个字符一个字符输出，'S2'表示两个字符两个字符输出
# 'Sn'表示n个字符n个字符输出，总字符数是n的整数倍
a = np.frombuffer(s, dtype="S2", count=3, offset=1)
print("frombuffer:")
print(a)  # [b'el' b'lo' b' W']
print()

# numpy.fromiter
# 此函数从任何可迭代对象构建一个ndarray对象，返回一个新的一维数组。

"""
numpy.fromiter(iterable, dtype, count=-1)
构造器接收下列参数：
　iterable：任何可迭代对象。
　dtype：返回数组的数据类型。
　count：需要读取的数据数量，默认为-1，读取所有数据。
"""

# 使用内置的range()函数返回列表对象，此列表的迭代器用于形成ndarray对象
# 使用 range 函数创建列表对象
list = range(5)
a = np.fromiter(list, float, 3)
print(a)  # [0. 1. 2.]
print()

# 3. NumPy数值范围数组

# numpy.arange
# 该函数从数值范围创建数组，返回ndarray对象，包含给定范围内的等间隔值

"""
numpy.arange(start, stop, step, dtype)
构造器接收下列参数：
　start：范围的起始值，默认为0。
　stop：范围的终止值（不包含）。
　step：两个值的间隔，默认为1。
  dtype：返回ndarray的数据类型，如果没有提供，就会使用输入数据的类型。
"""
x = np.arange(1, 100, 10, int)
print(x)  # [ 1 11 21 31 41 51 61 71 81 91]
print()

# numpy.linspace
# 该函数类似于arange()函数。在此函数中，指定了范围之间的均匀间隔数量，而不是步长

"""
numpy.linspace(start, stop, num, endpoint, retstep,dtype)
构造器接收下列参数：
　start：序列的起始值。
  stop：序列的终止值，如果endpoint为true，该值就包含于序列中。
　num：要生成的等间隔样例数量，默认为50。
　endpoint：序列中是否包含stop值，默认为ture。
  retstep：如果为true，就返回样例以及连续数字之间的步长。
  dtype：输出ndarray的数据类型。
"""

# (stop - start) / (num - 1)
a = np.linspace(10, 20, 5)  # 在 10 和 20 之间均匀分成 4 份
print(a)
print()

# (30 - 10) / ( 4 - 1 )
a = np.linspace(10, 30, 4)  # 在 10 和 30 之间均匀分成 3 份
print(a)
print()


# numpy.logspace
# 该函数返回一个ndarray对象，其中包含在对数刻度上均匀分布的数字。
# 刻度的开始和结束端点是某个底数的幂，通常为10

"""
numpy.logscale(start, stop, num, endpoint, base, dtype)
logspace函数的输出由以下参数决定：
　start：起始值是base ** start。
　stop：终止值是base ** stop。
　num：范围内的数值数量，默认为50。
　endpoint：如果为true，终止值就包含在输出数组中。
　base：对数空间的底数，默认为10。
　dtype：输出数组的数据类型，如果没有提供，就取决于其他参数。
"""
# 默认底数是 10
a = np.logspace(1.0, 2.0, num=10)
print(a)
print()
